#!/usr/bin/qdroid
#codepage=utf-8

// 2010.11.11 Обслуживающий скрипт для QDrTestMaster
// Собержит обработчики событий успешного прохождения теста или провала. 
//
// Скрипт загружает в память мастер тестов QDR
// (в заголовке окна появится панель мастера)
// ТОЛЬКО ДЛЯ ВЫПОЛНЕНЯ ВНУТРИ КАКОЙ_ЛИБО СРЕДЫ. 
// Собственно иначе и не нужно...
//
// тодо - сделать функции доступа к уже загруженной библиотеке
// что бы например сказать её выгрузиться



var version; 
version="[QDrTestMater init script for QDROID+QD4. ver 2010.11.11_0116]"; 

// требует версию qDROID не ниже 2010.11.20_0000
// требует версию QD4 не ниже 2010.11.10_0000

// TODO: сделать функции типа getQDroidVersion() и getPosbVersion()

var res;
var LibName;

var StrPassed ="->[V] Passed. :";
var StrError  ="->[X] ERROR! FAILED!  :";
var StrWarning="->[?] Warning.:";

//объекты
var testMaster;//будет var testMaster=new t_testMaster(); после загрузки расширения

//отчеты
var htmlReport="";
var htmlResultSummaryReport="";
var totalChecksCount=0;
var goodChecksCount=0;

//===========================================================================
function TestLibraryLoad(LibName)
{
  var res =0 ;
  var resstr="";
  // пробуем загрузить расширение. если не загрузили ранее - должны выдать "0" (ок)
  print (" LOADING... Library ["+LibName+"].");
  res=loadlib_qd(LibName); // <<----- загружаем расширение
  if (res="0") resstr=StrPassed;
  if (res<"0") resstr=StrError;
  if (res>"0") resstr=StrWarning;
  print ("      :: loading result code = ["+res+"]");
  print ("      :: (-1=error; 0=ok; +1=warnings)");
  print (""+resstr+"");
  return res;  
};

//===========================================================================
function loadlibs()
{
  //var rez=loadlib_qd("qdlib_tcpserver")
  //if (loadlib_qd("qdlib_tcpserver")<0) {print("CAN`T LOAD LIB: qdlib_tcpserver !!! "); return -1;};
  
  var rez=loadlib_qd("qdlib_testMaster")
  if (rez<0) { alert("ERROR: libQDrTestMaster_start.qs::function loadlibs()[0065]: \n CAN`T load QDRoid extention lib: qdlib_testMaster !!! "); return -1; };
  // пока что мы не умеем выгружать загруженные функции
  //if (rez>0) { alert("qdlib_testMaster is already loaded. Do you want to unload it? but we can`t in current wersion of QDroid") };
  
  var rez=loadlib_qd("qdlib_webview")
  if (rez<0) { alert("ERROR: libQDrTestMaster_start.qs::function loadlibs()[0068]: \n CAN`T load QDRoid extention lib: qdlib_webview !!! "); return -1; };
}; 


//===========================================================================
function onTestMaster_playStarted_SLOT(datetime , reason)
{
  htmlReport = " <hr><h3>" + datetime + ": Начало сценария. </h3>примечание/причина: ["+reason+"]<hr>";
  htmlResultSummaryReport="";
  
  return 0;
}; 

//===========================================================================
function onTestMaster_playFinished_SLOT(datetime , reason)
{

  //alert("Test actions play finished : \n"+datetime+" : "+reason); 
  
  htmlReport = htmlReport + "<hr>" + datetime + ": <font color=green><b>play finished:"+reason+"</b></font><hr>";
  htmlReport = htmlReport + htmlResultSummaryReport+"<hr> Total checks: "+ totalChecksCount+"<br>Succesfull: "+ goodChecksCount+"<br>Failed: "+ (totalChecksCount-goodChecksCount)+"<hr>";

  //var repManager= new t_universalInfoObjectPrintForm(); //менеджер форм печати POSB, мастер печати и др.
  //repManager.show_defaultPrintForm(htmlReport);
   
  var webViewPanel= new WebView(); //
  webViewPanel.show(htmlReport);// сначала надо подключиться - а потом показываться. потому что тут затармаживаемся
  webViewPanel.setWindowTitle("libQDrTestMaster_start.qs:: отчет о завершенном тестировании");//пока надо это делать после  show...

 
  
  return 0;
}; 

//===========================================================================
function onTestMaster_testCheck_SLOT(datetime, success, action, notes)
{//тут надо бы лог пополнить.
  //alert("Test actions play finished : \n"+reason); 
  //testMaster.get_controlPanel().show();
  if (success==true)
    {
      htmlReport = htmlReport + "<hr><b>#"+totalChecksCount+"</b> " + datetime + ": <font sise=+1 color=green><b>OK: TEST PASSED</b></font> <br>"+action+"<br><br>"+notes+"<br>";
      htmlResultSummaryReport = htmlResultSummaryReport +"<b>#"+totalChecksCount+"</b> "+ datetime + ": <font sise=+1 color=green><b>OK: TEST PASSED</b></font> <br>";
      goodChecksCount=goodChecksCount+1;
    }
    else
    {
      htmlReport = htmlReport + "<hr><b>"+totalChecksCount+"</b>" + datetime + ": <font sise=+1 color=red><b>ERROR: TEST FAILED</b></font> <br>"+action+"<br><br>"+notes+"<br>";
      htmlResultSummaryReport = htmlResultSummaryReport +"<b>#"+totalChecksCount+"</b> "+ datetime + ": <font sise=+1 color=red><b>ERROR: TEST FAILED</b></font> <br>";
    };
  totalChecksCount=totalChecksCount+1;

  return 0;
}; 
//===========================================================================
//функция 
//(string datetime, QWidget* widget, int localX, int localY, string action_full, string (array?) options)
//function true onTestMaster_customCheck_request(string checkID, testMasterCkeckObject *checkObj)
function onTestMaster_customCheck_request(datetime, success, action)
{

}
//===========================================================================  
// инициация тестовой среды и запуск сценариев тестирования
// scenarioList - файл со списом сценариев тестирования.
function loadTestMaster(scenarioList)
{
  
  //все что чвязано с тестированием и записью действий пользователя.
  var rez;
  testMaster=new t_testMaster();
  testMaster.installAppEventHandler();

  testMaster.get_agentPanel().show();
  
  testMaster.playStarted.connect(onTestMaster_playStarted_SLOT);//подключим обработчик события окончания проигрывания - потому что мы по старту - совершенно не задерживаемся...
  testMaster.testCheckResult.connect(onTestMaster_testCheck_SLOT);
  testMaster.playFinished.connect(onTestMaster_playFinished_SLOT);//подключим обработчик события окончания проигрывания - потому что мы по старту - совершенно не задерживаемся...

  // тут надо бы разобрать входные опции - и если нам сказали тестироваться - запустить перебор тестовых сценариев...
  // или выбрать в системе объект скрипт - в котором описан пакет тестов - и запустить его... 

  //////rez=testMaster.startPlay("./../shared/autotests/ser_001.posb.zero._base_docs_operations_ser_001_.tms.txt");  //запустим на исполнение тестовый сценарий
  ////rez=testMaster.startPlay("./../shared/autotests/ser_000.posb.zero._login_as_root_.tms.txt");  //запустим на исполнение тестовый сценарий
  
  
  if (scenarioList!="")
    {
      rez=testMaster.startPlay(scenarioList);  //запустим на исполнение тестовый сценарий
          //проигрывание будет запущено, через 0.3 сек, а нам пока отдают управление далее.
      if (rez<0) alert("testMaster.startPlay() ERROR: \n "+ testMaster.lasrError());  
    };
  
}
//===========================================================================  

function main()
{
  if (loadlibs()<0) return -1;

  //ПРОВЕРИТЬ ВЕРСИИ СРЕД - QDroid и POSB
  print ("QDroid version: "+ BBot.getPlatformVersion() );
  print ("QD4 version: "+ version+" ");
  print ("QDrTestMaster_init.qs: 2010.11.11");
  
  
  var boolLoadTestLib=1;
  var stringTestScenariousList="";
  //посмотрим что там нам передали в аргументах
  cArgs=BBot.getScriptArguments();
  for(var i in cArgs) 
   {
    //if (!cArgs.hasOwnProperty(i)) continue;
    if (boolLoadTestLib=-1) 
      {
        boolLoadTestLib=1; //вот теперь можно загружаться)))
        stringTestScenariousList = cArgs[i];
      };
    if (cArgs[i]=="--script") boolLoadTestLib=-1;
      //мы нашли указание загрузить тест, но нам нужен ещё файл со списокм тестов которые надо проиграть.
   };

  loadTestMaster(stringTestScenariousList);
  


  return 0; //all ok!
  //return "All Ok"; 
  //exit(); //QDroid функция завершения работы системы "вообще".

}//end of main()
#===========================================================================#

// примерно с QT 4.5 отдельного return не нужно. достаточно просто в последней 
// вызываемой функции отдать что либо - 
// это и будет отдано как результат работы всего скрипта.
// потому имитируем струтуру сишной программы. так удобнее и проще.

main();



